package com.atguigu.gmall.pms.service.impl;

import com.alibaba.fastjson.JSON;
import com.atguigu.gmall.pms.vo.ItemSkuAttrsVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.common.bean.PageResultVo;
import com.atguigu.gmall.common.bean.PageParamVo;

import com.atguigu.gmall.pms.mapper.SkuAttrValueMapper;
import com.atguigu.gmall.pms.entity.SkuAttrValueEntity;
import com.atguigu.gmall.pms.service.SkuAttrValueService;
import org.springframework.util.CollectionUtils;


@Service("skuAttrValueService")
public class SkuAttrValueServiceImpl extends ServiceImpl<SkuAttrValueMapper, SkuAttrValueEntity> implements SkuAttrValueService {

    @Override
    public PageResultVo queryPage(PageParamVo paramVo) {
        IPage<SkuAttrValueEntity> page = this.page(
                paramVo.getPage(),
                new QueryWrapper<SkuAttrValueEntity>()
        );

        return new PageResultVo(page);
    }

    @Override
    public List<SkuAttrValueEntity> querySkuSearchAttrValues(Long skuId) {


        return baseMapper.querySkuSearchAttrValues(skuId);
    }

    @Override
    public List<ItemSkuAttrsVo> queryItemSkuAttrsVoBySpuId(String spuId) {

        //查询数据库：
        //spuid=1567403173630308353
        //先根据spuid查询skuid集合：pms_sku
        //使用skuid查询销售属性和值集合: pms_sku_attr_value
        //联查pms_attr筛选出销售属性:
        List<SkuAttrValueEntity> skuAttrValueEntities = baseMapper.queryItemSkuAttrsVoBySpuId(spuId);
        if(CollectionUtils.isEmpty(skuAttrValueEntities)){
            return null;
        }
        List<ItemSkuAttrsVo> itemSkuAttrsVos = new ArrayList<>();
        //将不同sku的相同的attr  合并成一个ItemSkuAttrsVo对象
        //[{attrId:3,attrName:颜色,attrValue:黑色},{attrId:3,attrName:颜色,attrValue:白色}]
        //对list集合中的数据使用attrId分组就可以将相同的attrId对应的多个SkuAttrValueEntity分到一组中
        Map<Long, List<SkuAttrValueEntity>> map = skuAttrValueEntities.stream().collect(Collectors
                .groupingBy(skuAttrValueEntity -> skuAttrValueEntity.getAttrId()));
        map.forEach((attrId,attrs)->{//Long, List<SkuAttrValueEntity>
            ItemSkuAttrsVo itemSkuAttrsVo = new ItemSkuAttrsVo();
            itemSkuAttrsVo.setAttrId(attrId.toString());
            itemSkuAttrsVo.setAttrName(attrs.get(0).getAttrName());
            itemSkuAttrsVo.setAttrValues(attrs.stream().map(attr->attr.getAttrValue())
                    .collect(Collectors.toSet()));
            itemSkuAttrsVos.add(itemSkuAttrsVo);
        });
        return itemSkuAttrsVos;
    }

    @Override
    public Map<Long, String> querySkuSaleAttr(String skuId) {
        List<SkuAttrValueEntity> skuAttrValueEntities = this.list(new LambdaQueryWrapper<SkuAttrValueEntity>()
                .eq(SkuAttrValueEntity::getSkuId, skuId));
        if(CollectionUtils.isEmpty(skuAttrValueEntities)){
            return null;
        }
        Map<Long, String> map = new HashMap<>();
        for (SkuAttrValueEntity skuAttrValueEntity : skuAttrValueEntities) {
            map.put(skuAttrValueEntity.getAttrId(),skuAttrValueEntity.getAttrValue() );
        }

        return map;
    }

    @Override
    public String querySkusSaleAttrsJson(String spuId) {
        //根据spuid查询所有的skuid
        //查询sku的销售属性
        //将每个sku的销售属性值拼接成字符串 和skuid映射
        //[{sku_id: 1567403174871822337 , attrvalues: '黑色,8G,128G'},{}]
        List<Map<String,Object>> list = baseMapper.querySkusSaleAttrsJson(spuId);
        //{'黑色,8G,128G':1567403174871822337 }
        //将list中的多个Map，每个map的两个键的值封装到一个新的map中作为kv
        if(CollectionUtils.isEmpty(list)){
            return null;
        }
        Map<String,String> jsonMap = new HashMap<>();
        for (Map<String, Object> map : list) {
            String skuId = map.get("sku_id").toString();
            String attrvalues = map.get("attrvalues").toString();
            jsonMap.put(attrvalues ,skuId);
        }
        return JSON.toJSONString(jsonMap);
    }

}